desc:DDR Compressor V2.41
// Author Belov Vladimir aka Belovw
// RK Almaty 
// V2.01 2022.04.25
// V2.1  2022.05.16 New Experemntal Modes
// V2.2  2022.06.10 Ratio calculate Update
// V2.21 2022.06.12 Minor Update
// V2.21 2022.06.12 Minor Update
// V2.3  2022.06.13 RMS, New knee model
// V2.32 2022.06.14 Few optimization
// V2.40 2022.06.23 Side Chain 3-4
// V2.41 2022.06.28 Bag Ratio Log(0)=0

slider1:0<-20,20,1>In
slider2:-6<-30,0,0.1>Treshold
slider3:4<1,10,0.01>Ratio (10 = Lim)
slider4:3<0,20,1>Knee
slider5:4<0.01,100,0.01>Attack 1
slider6:200<10,1000,0.01>Release 1
 
slider8:0.5<0,1>Style 1<>2
slider9:1000<10,10000>Attack 2
slider10:5000<10,10000>Release 2

slider12:0<-12,12,1>Gain
slider13:90<0,100,1>Mix %
slider14:4<0,10,1>RMS

slider16:0<0,1,1{Own(1-2),Side Chain (3-4)}> Detect

@init
gr_meter=1;
gr_metera=1;
gr_meterl=1;


@slider
ginv=10^(slider1/20);
goutv=10^(slider12/20);
T=slider2;
r=slider3;r==10 ? r=100000; 
cl=slider8; ca=(1-slider8);
W=slider4;
OMIRDW=(1-1/r)/W; // One minus inverse R devision W

aa=exp(-log(9)*1000/srate/slider5); //Attack Short
ar=exp(-log(9)*1000/srate/slider6); //Release Short

al=exp(-log(9)*1000/srate/slider9); //Attack Long
rl=exp(-log(9)*1000/srate/slider10); //Release Long 

RMSTC=exp(-1/(srate * 0.001 * slider14)); // RMS Time Coeff

m1=slider13/100;
m0=1-m1;

@block


@sample
aaa=log10(0);
spl0*=ginv;
spl1*=ginv;
spl2*=ginv;
spl3*=ginv;

slider16 == 0 ? (in=max(abs(spl0),abs(spl1)); // Detecet IN
                ):(
                in=max(abs(spl2),abs(spl3)));



/////////
// RMS //
/////////

RMSTC != 0 ? (
              RMS=RMS*RMSTC+in*in*(1-RMSTC);
              SRMS=in=1.4*sqrt(RMS);
              );
/////////////
// in 2 dB //
/////////////

indb=20*log10(in+0.0000000000000000001);

//////////
// Comp //
//////////

indbMT=indb-T; // indb minus T

W < 0.3 ? (
            insc=(indb>T) * ( indbMT/r - indbMT );
          ):  
          (
            insc=-W * log10( 1+10^(
                                   indbMT*OMIRDW //(1-1/r)/W 
                                  )
                            );
          ); 

////////////
// Balans //
////////////

ga=ca*insc;
gl=cl*insc;

//////////
// ADSR //
//////////
ga<ga0 ? (ga=aa*ga0 + (1-aa)*ga) : (ga=ar*ga0 + (1-ar)*ga); ga0=ga;
gl<gl0 ? (gl=al*gl0 + (1-al)*gl) : (gl=rl*gl0 + (1-rl)*gl); gl0=gl;
g=ga+gl;

////////////////
// Mix in OUT //
////////////////

gout=(m0+m1*10^(g/20))*goutv;
spl0*=gout;
spl1*=gout;



@gfx 0 32 // request horizontal/vertical heights (0 means dont care)

  gr_meter=min(10^(g/20),gr_meter);
  gr_meter *= exp(1/60); gr_meter>1 ? gr_meter=1; // decay meter here so if the audio processing stops it doesnt "stick"
  
  gr_metera=min(10^(ga/20),gr_metera);
  gr_metera *= exp(1/60); gr_metera>1 ? gr_metera=1; // decay meter here so if the audio processing stops it doesnt "stick"
  
  gr_meterl=min(10^(gl/20),gr_meterl);
  gr_meterl *= exp(1/60); gr_meterl>1 ? gr_meterl=1; // decay meter here so if the audio processing stops it doesnt "stick"
  
  gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;
  
  meter_bot=20;
  meter_h=32; //min(gfx_h,32);
  xscale=gfx_w*20/meter_bot;

  gfx_y=0;
  gfx_x=gfx_w + log10(gr_meter)*xscale;
  gfx_rectto(gfx_w,10);
  
  gfx_y=11;
  gfx_x=gfx_w + log10(gr_metera)*xscale;
  gfx_rectto(gfx_w,21);
  
  gfx_y=22;
  gfx_x=gfx_w + log10(gr_meterl)*xscale;
  gfx_rectto(gfx_w,33);

  gfx_r=gfx_g=gfx_b=1.0; gfx_a=0.6;

  s2=sqrt(2)/2;
  gg = s2;
  while(
    gfx_x=gfx_w + log10(gg)*xscale;
    gfx_x >= 0 ? 
    (
      gfx_y=0;
      gfx_lineto(gfx_x,meter_h,0);
      gfx_y=meter_h-gfx_texth;
      gfx_x+=2;
      gfx_drawnumber(log10(gg)*20,0);
      gfx_drawchar($'d');
      gfx_drawchar($'B');
    );
    gg*=s2;
    gfx_x >=0;
  );
  gfx_a=0.7;

  gfx_x=0; gfx_y=3;//meter_h/2 - gfx_texth/2;
  gfx_drawnumber(log10(gr_meter)*20,1);
  gfx_drawchar($'d');
  gfx_drawchar($'B');
  
  gfx_measurestr("all",x1,y1);
  gfx_x=gfx_w-x1; gfx_y=2;
  gfx_drawstr("all");
  

  gfx_x=gfx_w-8; gfx_y=13;
  gfx_drawchar($'1');
  
  gfx_x=gfx_w-8; gfx_y=24;
  gfx_drawchar($'2');
  

